package com.hsu.hsurpc.utils;

import org.yaml.snakeyaml.Yaml;

import java.io.InputStream;
import java.util.Map;

/**
 * Yaml 配置文件加载工具类
 * @Author Hsu琛君珩
 * @Date 2024-09-18
 */
public class YamlConfigUtils {

    /**
     * 从 YAML 文件加载配置并映射为指定的 Java 对象
     *
     * @param fileName YAML 文件名
     * @param tClass   目标类类型
     * @param <T>      泛型
     * @return 映射的配置对象
     */
    public static <T> T loadYamlConfig(String fileName, Class<T> tClass) {
        Yaml yaml = new Yaml();
        try (InputStream inputStream = YamlConfigUtils.class.getClassLoader().getResourceAsStream(fileName)) {
            if (inputStream == null) {
                throw new RuntimeException("YAML 文件未找到: " + fileName);
            }
            // 使用 SnakeYAML 将 YAML 文件内容解析为 Map
            Object loadedYaml = yaml.load(inputStream);

            if (loadedYaml instanceof Map) {
                Map<String, Object> map = (Map<String, Object>) loadedYaml;
                // 检查是否有 "rpc" 根节点
                if (map.containsKey("rpc")) {
                    Map<String, Object> rpcConfigMap = (Map<String, Object>) map.get("rpc");
                    // 使用 Map 将其映射为所需的配置对象
                    return yaml.loadAs(yaml.dump(rpcConfigMap), tClass);
                } else {
                    throw new RuntimeException("YAML 文件中缺少 'rpc' 根节点");
                }
            } else {
                throw new RuntimeException("YAML 文件格式不正确");
            }
        } catch (Exception e) {
            throw new RuntimeException("加载 YAML 文件失败: " + fileName, e);
        }
    }
}
